package com.zhj.demo;

import com.zhj.demo.aop.AspectTarget;
import com.zhj.demo.ioc.IocTest;
import com.zhj.helloframework.aop.AspectWeaver;
import com.zhj.helloframework.core.BeanContainer;
import com.zhj.helloframework.injection.DependencyInjector;
import lombok.extern.slf4j.Slf4j;

/**
 * @Author: zhj
 * @Description: 测试类
 * @Date: 2021/10/9 17:01
 * @Version: 1.0
 */
@Slf4j
public class DemoTest {

    public static void main(String[] args) {
        // 获取Bean容器实例
        BeanContainer beanContainer = BeanContainer.getInstance();
        // 加载指定包下的bean，并进行实例化(com.zhj.demo路径下所有被注解标记的.class对象都会存储在beanContainer中的beanMap)
        beanContainer.loadBeans("com.zhj.demo");

        // 检测一下未被增强之前的对象
        AspectTarget bean = (AspectTarget) beanContainer.getBean(AspectTarget.class);
        log.info(bean.getClass().getSimpleName());

        // 进行aop增强(找到要增强的类和切面类，然后进行筛选后，创建动态代理对象，放入beanContainer)
        new AspectWeaver().doAop();
        // 进行ioc注入(筛选beanContainer中的对象，获取所有被@Autowired注解标记的成员变量，
        // 根据成员变量的类型找到对应的实例，通过反射将对应的成员变量实例注入到成员变量所在类的实例里)
        new DependencyInjector().doIoc();

        bean = (AspectTarget) beanContainer.getBean(AspectTarget.class);
        log.info(bean.getClass().getSimpleName());

        // 获取已经被依赖注入完成之后的对象
        IocTest iocTest = (IocTest) beanContainer.getBean(IocTest.class);
        iocTest.test();
    }
}

